package springbootmybatis.demo.dao.common;

import java.util.List;

import javax.annotation.Resource;

import org.apache.ibatis.session.ExecutorType;
import org.apache.ibatis.session.SqlSession;
import org.mybatis.spring.SqlSessionTemplate;
import org.springframework.stereotype.Repository;
import springbootmybatis.demo.dao.common.impl.Dao;


@Repository("daoSupport")
public class DaoSupport implements Dao {
	
	@Resource(name = "sqlSessionTemplate")
	private SqlSessionTemplate sqlSessionTemplate;
	
	/**
	 * 录入保存
	 * @return Integer 受插入影响的行数。
	 */
	@Override
	public Integer save(String statement, Object parameter) throws Exception {
		return sqlSessionTemplate.insert(statement,parameter);
	}
	/**
	 * 修改
	 * @return Integer 受修改影响的行数。
	 */
	@Override
	public Integer update(String statement, Object parameter) throws Exception {
		return sqlSessionTemplate.update(statement, parameter);
	}
	/**
	 * 批量修改
	 * @param statement bean 标识符
	 * @param objectList 参数对象列表
	 * @return Integer 受批量修改的行数
	 */
	public Integer batchUpdates(String statement, List<?> objectList) throws Exception {
//		修改影响的行数
		Integer updateNum =0;
//		批量执行器
		SqlSession sqlSession = sqlSessionTemplate.getSqlSessionFactory().openSession(ExecutorType.BATCH,false);
		try {
//			判断 参数列表不为空
			if(null != objectList) {
//				循环单词修改并自加影响行数数值
				for(int num = 0 ; num < objectList.size(); num ++) {
					sqlSession.update(statement, objectList.get(num));
					updateNum ++;
				}
//				将数据与插入到数据库
				sqlSession.flushStatements();
//				上传保存
				sqlSession.commit();
//				清空当前 SqlSession 缓存
				sqlSession.clearCache();
			}
		}finally{
//			关闭 sqlSession
			sqlSession.close();
		}
		return updateNum;
	}
	/**
	 * 删除
	 * @return Integer
	 */
	@Override
	public Integer delete(String statement, Object parameter) throws Exception {
		return sqlSessionTemplate.delete(statement, parameter);
	}
	/**
	 * 批量删除
	 * @param statement bean 标识符
	 * @param objectList 参数对象列表
	 * @return Integer 受批量删除的行数
	 * @throws Exception
	 */
	public Integer batchDeletes(String statement, List<?> objectList) throws Exception {
//		修改影响的行数
		Integer updateNum =0;
//		批量执行器
		SqlSession sqlSession = sqlSessionTemplate.getSqlSessionFactory().openSession(ExecutorType.BATCH,false);
		try {
//			判断 参数列表不为空
			if(null != objectList) {
//				循环单词修改并自加影响行数数值
				for(int num = 0 ; num < objectList.size(); num ++) {
					sqlSession.delete(statement, objectList.get(num));
					updateNum ++;
				}
//				将数据与插入到数据库
				sqlSession.flushStatements();
//				上传保存
				sqlSession.commit();
//				清空当前 SqlSession 缓存
				sqlSession.clearCache();
			}
		}finally{
//			关闭 sqlSession
			sqlSession.close();
		}
		return updateNum;
	}
	/**
	 * 查询
	 * @return Object 映射的对象
	 */
	@Override
	public Object findForObject(String statement, Object parameter) throws Exception {
		return sqlSessionTemplate.selectOne(statement, parameter);
	}
	
	/**
	 * 批量查询
	 * @return Object 映射对象列表
	 */
	@Override
	public Object findForList(String statement, Object parameter) throws Exception {
		return sqlSessionTemplate.selectList(statement, parameter);
	}
	
	/***
	  * @return Object map对象
	 */
	@Override
	public Object findForMap(String statement, Object parameter , String mapKey) throws Exception {
		return sqlSessionTemplate.selectMap(statement, parameter , mapKey);
	}

}
